import fs from 'fs'
import { fileURLToPath, pathToFileURL } from 'url'

function findControllers() {
    let controllerUrl = new URL('../controllers', import.meta.url).href;// 使用es6的路径模块 此处pathname: '/C:/Users/Administrator/Desktop/23%E7%BA%A7%E5%85%A8%E6%A0%882%E7%8F%AD/controllers'有问题
    // console.log(controllerUrl);

    // 转换成纯路径
    let controllerPath = fileURLToPath(controllerUrl);
    // console.log(controllerPath);


    if (fs.existsSync(controllerPath)) {
        // 读取文件使用路径
        let allFiles = fs.readdirSync(controllerPath);// 同步方法，因为这个同步方法只会在应用启动的时候执行一次，不会在平时阻塞线程，所以并不存在问题
        let allControllers = allFiles.filter(item => item.endsWith('.js'))
            .map(item => pathToFileURL(controllerPath + '/' + item));// 加载模块最好使用url的形式：file:///c:/XXXX
        // console.log(allControllers);

        return allControllers;
    }
    return null;
}


function registerRoute(router, controllers) {
    if (controllers === null) {
        return
    }
    // 遍历所有的控制器,动态导入每个控制器模块
    controllers.forEach(async item => {
        // 动态导入模块
        let { obj } = await import(item);

        // 遍历模块中的对象
        for (let key in obj) {
            let x = key.split(' ');

            let [keyMethod, keyPath] = key.split(' ');
            let keyFn = obj[key];
            // 判断请求的方法，使用相应的注册函数
            if (keyMethod === 'get') {
                router.get(keyPath, keyFn);
            }
            if (keyMethod === 'post') {
                router.post(keyPath, keyFn);
            }
            if (keyMethod === 'put') {
                router.put(keyPath, keyFn);
            }
            if (keyMethod === 'delete') {
                router.delete(keyPath, keyFn);
            }
        }
    })
}


export const findAllControllers = findControllers
export const regRoute = registerRoute
